| @@ -3,10 +3,12 @@ | ||
| 3 | 3 | from __future__ import division | 
| 4 | 4 |  | 
| 5 | 5 | from django_response import response | 
| 6 | +from logit import logit | |
| 6 | 7 |  | 
| 7 | -from mch.models import BrandInfo, DistributorInfo, ModelInfo | |
| 8 | +from mch.models import BrandInfo, DistributorInfo, LatestAppInfo, ModelInfo | |
| 8 | 9 |  | 
| 9 | 10 |  | 
| 11 | +@logit | |
| 10 | 12 | def brands_list(request): | 
| 11 | 13 |      brands = BrandInfo.objects.filter(status=True).order_by('position') | 
| 12 | 14 | brands = [brand.data for brand in brands] | 
| @@ -16,6 +18,7 @@ def brands_list(request): | ||
| 16 | 18 | }) | 
| 17 | 19 |  | 
| 18 | 20 |  | 
| 21 | +@logit | |
| 19 | 22 | def models_list(request): | 
| 20 | 23 |      models = ModelInfo.objects.filter(status=True).order_by('position') | 
| 21 | 24 | models = [model.data for model in models] | 
| @@ -25,6 +28,7 @@ def models_list(request): | ||
| 25 | 28 | }) | 
| 26 | 29 |  | 
| 27 | 30 |  | 
| 31 | +@logit | |
| 28 | 32 | def distributors_list(request): | 
| 29 | 33 |      distributors = DistributorInfo.objects.filter(status=True).order_by('position') | 
| 30 | 34 | distributors = [distributor.data for distributor in distributors] | 
| @@ -32,3 +36,20 @@ def distributors_list(request): | ||
| 32 | 36 |      return response(200, data={ | 
| 33 | 37 | 'distributors': distributors, | 
| 34 | 38 | }) | 
| 39 | + | |
| 40 | + | |
| 41 | +@logit | |
| 42 | +def upgrade_api(request): | |
| 43 | + """ APP 升级 """ | |
| 44 | + try: | |
| 45 | + appinfo = LatestAppInfo.objects.filter(status=True)[0].adr | |
| 46 | + except IndexError: | |
| 47 | +        appinfo = { | |
| 48 | + 'latest_version_code': '', | |
| 49 | + 'latest_version_name': '', | |
| 50 | + 'latest_url': '', | |
| 51 | + } | |
| 52 | + | |
| 53 | +    return response(200, 'Get Latest App Success', u'获取最新版信息成功', { | |
| 54 | + 'appinfo': appinfo, | |
| 55 | + }) | 
| @@ -194,3 +194,7 @@ urlpatterns += [ | ||
| 194 | 194 | url(r'^api/encrypt$', encrypt_views.encrypt, name='encrypt'), | 
| 195 | 195 | url(r'^api/decrypt$', encrypt_views.decrypt, name='decrypt'), | 
| 196 | 196 | ] | 
| 197 | + | |
| 198 | +urlpatterns += [ | |
| 199 | + url(r'^api/upgrade$', mch_views.upgrade_api, name='upgrade_api2'), # APP 升级 | |
| 200 | +] | 
| @@ -1,8 +1,9 @@ | ||
| 1 | 1 | # -*- coding: utf-8 -*- | 
| 2 | 2 |  | 
| 3 | 3 | from django.contrib import admin | 
| 4 | +from pysnippets.strsnippets import strip | |
| 4 | 5 |  | 
| 5 | -from mch.models import BrandInfo, DistributorInfo, ModelImageInfo, ModelInfo | |
| 6 | +from mch.models import BrandInfo, DistributorInfo, LatestAppInfo, ModelImageInfo, ModelInfo | |
| 6 | 7 |  | 
| 7 | 8 |  | 
| 8 | 9 | class BrandInfoAdmin(admin.ModelAdmin): | 
| @@ -24,7 +25,19 @@ class DistributorInfoAdmin(admin.ModelAdmin): | ||
| 24 | 25 |      list_filter = ('brand_id', 'status') | 
| 25 | 26 |  | 
| 26 | 27 |  | 
| 28 | +class LatestAppInfoAdmin(admin.ModelAdmin): | |
| 29 | +    list_display = ('latest_adr_version_code', 'latest_adr_version_name', 'latest_adr_app', 'latest_adr_url', 'status', 'created_at', 'updated_at') | |
| 30 | +    list_filter = ('status', ) | |
| 31 | + | |
| 32 | + def save_model(self, request, obj, form, change): | |
| 33 | + obj.latest_adr_version_name = strip(obj.latest_adr_version_name) | |
| 34 | + obj.latest_adr_app = strip(obj.latest_adr_app) | |
| 35 | + obj.latest_adr_url = strip(obj.latest_adr_url) | |
| 36 | + obj.save() | |
| 37 | + | |
| 38 | + | |
| 27 | 39 | admin.site.register(BrandInfo, BrandInfoAdmin) | 
| 28 | 40 | admin.site.register(ModelInfo, ModelInfoAdmin) | 
| 29 | 41 | admin.site.register(ModelImageInfo, ModelImageInfoAdmin) | 
| 30 | 42 | admin.site.register(DistributorInfo, DistributorInfoAdmin) | 
| 43 | +admin.site.register(LatestAppInfo, LatestAppInfoAdmin) | 
| @@ -0,0 +1,36 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Generated by Django 1.11.9 on 2018-01-14 15:14 | |
| 3 | +from __future__ import unicode_literals | |
| 4 | + | |
| 5 | +from django.db import migrations, models | |
| 6 | +import models_ext.fileext | |
| 7 | + | |
| 8 | + | |
| 9 | +class Migration(migrations.Migration): | |
| 10 | + | |
| 11 | + dependencies = [ | |
| 12 | +        ('mch', '0003_auto_20180104_0428'), | |
| 13 | + ] | |
| 14 | + | |
| 15 | + operations = [ | |
| 16 | + migrations.CreateModel( | |
| 17 | + name='LatestAppInfo', | |
| 18 | + fields=[ | |
| 19 | +                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | |
| 20 | +                ('status', models.BooleanField(db_index=True, default=True, help_text='Status', verbose_name='status')), | |
| 21 | +                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Create Time', verbose_name='created_at')), | |
| 22 | +                ('updated_at', models.DateTimeField(auto_now=True, help_text='Update Time', verbose_name='updated_at')), | |
| 23 | +                ('latest_adr_version_code', models.IntegerField(default=0, help_text='\u6700\u65b0\u5b89\u5353\u7248\u672c\u53f7', verbose_name='latest_adr_version_code')), | |
| 24 | +                ('latest_adr_version_name', models.CharField(blank=True, help_text='\u6700\u65b0\u5b89\u5353\u7248\u672c\u540d', max_length=16, null=True, verbose_name='latest_adr_version_name')), | |
| 25 | +                ('latest_adr_app', models.FileField(blank=True, help_text='\u6700\u65b0\u7248\u5b89\u5353 APP', null=True, upload_to=models_ext.fileext.upload_path, verbose_name='latest_adr_app')), | |
| 26 | +                ('latest_adr_url', models.URLField(blank=True, help_text='\u6700\u65b0\u7248 APP \u94fe\u63a5', max_length=255, null=True, verbose_name='latest_adr_url')), | |
| 27 | +                ('latest_ios_version_code', models.IntegerField(default=0, help_text='\u6700\u65b0 iOS \u7248\u672c\u53f7', verbose_name='latest_ios_version_code')), | |
| 28 | +                ('latest_ios_version_name', models.CharField(blank=True, help_text='\u6700\u65b0 iOS \u7248\u672c\u540d', max_length=16, null=True, verbose_name='latest_ios_version_name')), | |
| 29 | +                ('latest_ios_url', models.URLField(blank=True, help_text='\u6700\u65b0\u7248 iOS \u94fe\u63a5', max_length=255, null=True, verbose_name='latest_ios_url')), | |
| 30 | + ], | |
| 31 | +            options={ | |
| 32 | + 'verbose_name': '\u5347\u7ea7\u914d\u7f6e\u4fe1\u606f', | |
| 33 | + 'verbose_name_plural': '\u5347\u7ea7\u914d\u7f6e\u4fe1\u606f', | |
| 34 | + }, | |
| 35 | + ), | |
| 36 | + ] | 
| @@ -115,3 +115,44 @@ class DistributorInfo(BaseModelMixin): | ||
| 115 | 115 | 'distributor_name': self.distributor_name, | 
| 116 | 116 | 'distributor_descr': self.distributor_descr, | 
| 117 | 117 | } | 
| 118 | + | |
| 119 | + | |
| 120 | +class LatestAppInfo(BaseModelMixin): | |
| 121 | + latest_adr_version_code = models.IntegerField(_(u'latest_adr_version_code'), default=0, help_text=u'最新安卓版本号') | |
| 122 | + latest_adr_version_name = models.CharField(_(u'latest_adr_version_name'), max_length=16, blank=True, null=True, help_text=u'最新安卓版本名') | |
| 123 | + latest_adr_app = models.FileField(_(u'latest_adr_app'), upload_to=upload_path, blank=True, null=True, help_text=u'最新版安卓 APP') | |
| 124 | + latest_adr_url = models.URLField(_(u'latest_adr_url'), max_length=255, blank=True, null=True, help_text=u'最新版 APP 链接') | |
| 125 | + | |
| 126 | + latest_ios_version_code = models.IntegerField(_(u'latest_ios_version_code'), default=0, help_text=u'最新 iOS 版本号') | |
| 127 | + latest_ios_version_name = models.CharField(_(u'latest_ios_version_name'), max_length=16, blank=True, null=True, help_text=u'最新 iOS 版本名') | |
| 128 | + latest_ios_url = models.URLField(_(u'latest_ios_url'), max_length=255, blank=True, null=True, help_text=u'最新版 iOS 链接') | |
| 129 | + | |
| 130 | + class Meta: | |
| 131 | + verbose_name = _(u'升级配置信息') | |
| 132 | + verbose_name_plural = _(u'升级配置信息') | |
| 133 | + | |
| 134 | + def __unicode__(self): | |
| 135 | +        return u'{0.pk}'.format(self) | |
| 136 | + | |
| 137 | + @property | |
| 138 | + def final_latest_adr_url(self): | |
| 139 | + return self.latest_adr_url or upload_file_url(self.latest_adr_app) | |
| 140 | + | |
| 141 | + @property | |
| 142 | + def data(self): | |
| 143 | +        return { | |
| 144 | + 'latest_adr_version_code': self.latest_adr_version_code, | |
| 145 | + 'latest_adr_version_name': self.latest_adr_version_name, | |
| 146 | + 'latest_adr_url': self.final_latest_adr_url, | |
| 147 | + 'latest_ios_version_code': self.latest_ios_version_code, | |
| 148 | + 'latest_ios_version_name': self.latest_ios_version_name, | |
| 149 | + 'latest_ios_url': self.latest_ios_url, | |
| 150 | + } | |
| 151 | + | |
| 152 | + @property | |
| 153 | + def adr(self): | |
| 154 | +        return { | |
| 155 | + 'latest_adr_version_code': self.latest_adr_version_code, | |
| 156 | + 'latest_adr_version_name': self.latest_adr_version_name, | |
| 157 | + 'latest_adr_url': self.final_latest_adr_url, | |
| 158 | + } | 
| @@ -0,0 +1,25 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Generated by Django 1.11.9 on 2018-01-14 15:14 | |
| 3 | +from __future__ import unicode_literals | |
| 4 | + | |
| 5 | +from django.db import migrations, models | |
| 6 | + | |
| 7 | + | |
| 8 | +class Migration(migrations.Migration): | |
| 9 | + | |
| 10 | + dependencies = [ | |
| 11 | +        ('operation', '0017_auto_20180103_0446'), | |
| 12 | + ] | |
| 13 | + | |
| 14 | + operations = [ | |
| 15 | + migrations.AlterField( | |
| 16 | + model_name='latestappinfo', | |
| 17 | + name='latest_adr_version_name', | |
| 18 | + field=models.CharField(blank=True, help_text='\u6700\u65b0\u5b89\u5353\u7248\u672c\u540d', max_length=16, null=True, verbose_name='latest_adr_version_name'), | |
| 19 | + ), | |
| 20 | + migrations.AlterField( | |
| 21 | + model_name='latestappinfo', | |
| 22 | + name='latest_ios_version_name', | |
| 23 | + field=models.CharField(blank=True, help_text='\u6700\u65b0 iOS \u7248\u672c\u540d', max_length=16, null=True, verbose_name='latest_ios_version_name'), | |
| 24 | + ), | |
| 25 | + ] | 
| @@ -9,12 +9,12 @@ from pai2.basemodels import PaiaiSrcMixin, PlatformMixin, VersionMixin | ||
| 9 | 9 |  | 
| 10 | 10 | class LatestAppInfo(BaseModelMixin, PaiaiSrcMixin): | 
| 11 | 11 | latest_adr_version_code = models.IntegerField(_(u'latest_adr_version_code'), default=0, help_text=u'最新安卓版本号') | 
| 12 | - latest_adr_version_name = models.CharField(_(u'latest_adr_version_name'), max_length=255, blank=True, null=True, help_text=u'最新安卓版本名') | |
| 12 | + latest_adr_version_name = models.CharField(_(u'latest_adr_version_name'), max_length=16, blank=True, null=True, help_text=u'最新安卓版本名') | |
| 13 | 13 | latest_adr_app = models.FileField(_(u'latest_adr_app'), upload_to=upload_path, blank=True, null=True, help_text=u'最新版安卓 APP') | 
| 14 | 14 | latest_adr_url = models.URLField(_(u'latest_adr_url'), max_length=255, blank=True, null=True, help_text=u'最新版 APP 链接') | 
| 15 | 15 |  | 
| 16 | 16 | latest_ios_version_code = models.IntegerField(_(u'latest_ios_version_code'), default=0, help_text=u'最新 iOS 版本号') | 
| 17 | - latest_ios_version_name = models.CharField(_(u'latest_ios_version_name'), max_length=255, blank=True, null=True, help_text=u'最新 iOS 版本名') | |
| 17 | + latest_ios_version_name = models.CharField(_(u'latest_ios_version_name'), max_length=16, blank=True, null=True, help_text=u'最新 iOS 版本名') | |
| 18 | 18 | latest_ios_url = models.URLField(_(u'latest_ios_url'), max_length=255, blank=True, null=True, help_text=u'最新版 iOS 链接') | 
| 19 | 19 |  | 
| 20 | 20 | class Meta: |